function smallestSubarrays(nums) {
  const n = nums.length;
  const answer = new Array(n).fill(1); // 每个位置至少有长度1的子数组
  // 存储每个位对应的最后出现位置
  const last = new Array(32).fill(-1);

  // 从后往前遍历，这样可以高效追踪每个位的最后出现位置
  for (let i = n - 1; i >= 0; i--) {
    let maxLen = 1;

    // 检查当前数字的每个位
    for (let j = 0; j < 32; j++) {
      // 如果当前位为1，更新该位的最后出现位置
      if (nums[i] & (1 << j)) {
        last[j] = i;
      }

      // 如果该位在后面出现过，计算需要多少长度才能包含该位
      if (last[j] !== -1) {
        maxLen = Math.max(maxLen, last[j] - i + 1);
      }
    }

    answer[i] = maxLen;
  }

  return answer;
}

// 测试示例
console.log(smallestSubarrays([1, 0, 2, 1, 3])); // 输出: [3,3,2,2,1]
console.log(smallestSubarrays([1, 2])); // 输出: [2,1]
